<?php

declare(strict_types=1);
namespace App\CustHub\Helpers;

use Mine\Helper\Id;

class Chain
{
    /**
     * 生成短链短码
     * @param $long_url
     * @param int $num
     * @return string
     */
    public function chainCode( $long_url ,$num=6)
    {
        $base32 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        $uniqueId = container()->get(Id::class)->getId();
        // 利用md5算法方式生成hash值
        $hex = md5($long_url.$uniqueId);
        $hexLen = strlen($hex);

        $output = array();
        for( $i = 0; $i <  4/*$subHexLen */; $i++ )
        {
            // 将这 hex 字符串，每一份8个字符，将其视作16进制串与0x3fffffff(30位1)与操作
            //        $subHex = substr($hex, $i*8, 8);
            $subHex = substr($hex, $i * $hexLen / 4, $hexLen / 4);

            $idx =  hexdec($subHex) & 0x3FFFFFFF;

            // 这30位分成6段, 每5个一组，算出其整数值，然后映射到我们准备的62个字符
            $out = '';
            for( $j = 0; $j < $num; $j++ )
            {
                $val = $idx & 0x0000003d;
                $out .= $base32[$val];
                $idx = $idx >> ($num-1);
            }
            $output[$i] = $out;
        }

        return  $output[array_rand($output)];
    }
}